/*
 * Agent.cpp
 *
 *  Created on: Mar 19, 2012
 *      Author: s146913
 */

#include "Agent.h"

Agent::Agent(char* type, int aantalOmDoorTeLaten, BigBrother* bb) :
	Thread(type) {
	kijkRichting = NOORD;
	Agent::aantalOmDoorTeLaten = aantalOmDoorTeLaten;
	bigb = bb;
}

Agent::Agent(char* type, BigBrother* bb) :
	Thread(type) {
	kijkRichting = NOORD;
	aantalOmDoorTeLaten = 5;
	bigb = bb;
}

Richting Agent::getKijkRichting() {
	return kijkRichting;
}

void Agent::run() {

	int gepasseerd = 0;

	while (true) {
		msleep(1000);
		determineCurrentConditionAndMutex();
		if(gepasseerd < aantalOmDoorTeLaten && wachtHuidigeRichting > 0) {

			mCurrent->lock();
			cout << "AGENT: Signalling now" << endl;

			cCurrent->signal();

			bigb->getPasseerd()->wait(mCurrent);
			wachtHuidigeRichting--;
			bigb->verlaagTeller(kijkRichting);
			gepasseerd++;
			cout << "AGENT: car " << gepasseerd << " passed." << endl;

			mCurrent->unlock();
		}
		else{
			draai();
			gepasseerd = 0;
		}
	}
}

void Agent::draai() {
	switch (kijkRichting) {
	case NOORD:
		kijkRichting = OOST;
		break;
	case OOST:
		kijkRichting = ZUID;
		break;
	case ZUID:
		kijkRichting = WEST;
		break;
	case WEST:
		kijkRichting = NOORD;
		break;
	}
	cout << endl << "\tKijkrichting: " << kijkRichting << endl;
}

void Agent::determineCurrentConditionAndMutex() {
	switch (kijkRichting) {
	case NOORD:
		cCurrent = bigb->getNoord();
		mCurrent = bigb->getMutexNoord();
		wachtHuidigeRichting = bigb->getWachtendeNoord();
		break;
	case OOST:
		cCurrent = bigb->getOost();
		mCurrent = bigb->getMutexOost();
		wachtHuidigeRichting = bigb->getWachtendeOost();
		break;
	case ZUID:
		cCurrent = bigb->getZuid();
		mCurrent = bigb->getMutexZuid();
		wachtHuidigeRichting = bigb->getWachtendeZuid();
		break;
	case WEST:
		cCurrent = bigb->getWest();
		mCurrent = bigb->getMutexWest();
		wachtHuidigeRichting = bigb->getWachtendeWest();
		break;
	}
}
